LLVM Assembly programozási nyelv

Utasítások, vezérlési szerkezetek

Modul szerkezet

Az LLVM modulok felépítését az alábbi ábra szemlélteti:

LLVM modul szerkezet

Ebben a részben a BasicBlock-ok belsejében használható legfontosabb utasítások leírása található.

Aritmetikai utasítások

Szintaxis: <eredmény> = <utasítás-név> <típus> <operandus1>, <operandus2>

Utasítás neveLeírás
add, faddösszeadás – egész és lebegőpontos
sub, fsubkivonás – egész és lebegőpontos
mul, fmulszorzás – egész és lebegőpontos
udivegész osztás
sdivegész osztás (előjeles)
fdivlebegőpontos osztás
uremegész maradék
sremegész maradék (előjeles)
fremlebegőpontos maradék
shlbalra tolás
lshrjobbra tolás, nullákkal kiegészítve
ashrjobbra tolás, előjelet tartva
andlogikai és művelet, bitenként elvégezve
orlogikai vagy művelet, bitenként elvégezve
xorlogikai kizáró vagy művelet, bitenként elvégezve

Összehasonlító utasítások

Eredményük mindig i1, azaz logikai típusú. Két külön összehasonlító operátor létezik:

Mutató- és memória-kezelő utasítások

Memória foglalás az aktuális hívási vermen:
<eredmény> = alloca <típus>[, <egész-típus> <elemszám>]
Az aktuális függvény visszatérésekor az így foglalt memória felszabadul.

Memória olvasás:
<eredmény> = load <típus>* <mutató>

Memória írás:
store <típus> <érték>, <típus>* <mutató>

Memória cím számítás:
<eredmény> = getelementptr <típus>* <mutató> {, <egész-típus> <index>}*

Szekvencia

A nyelvben nincs utasítások elválasztására vagy lezárására szolgáló karakter. Egy utasítást egy sorba kell írni, az egymás alatt, egy blokkban leírt utasítások szekvenciálisan hajtódnak végre. A BasicBlock-ok nem feltétlen a leírás sorrendjében hajtódnak végre, mert mindegyiknek valamilyen vezérlő utasítással kell végetérnie.

Elágazás

Ugrás (feltételes):
br i1 <feltétel> label <igaz-címke>, label <hamis-címke>

Többágú elágazás:
switch <egész-típus> <érték>, label <alapértelmezett-címke> [ <egész-típus> <érték1>, label <címke1> … ]

Ciklus

A nyelv nem tartalmaz ciklust, de ugró utasítások segítségével természetesen megvalósíthatók. Például:

LoopHeader: br %Loop Loop: %i = phi i32 [ 0, %LoopHeader ], [ %ni, %Loop ] %ni = add i32 %i, 1 br label %Loop

Vezérlésátadó utasítások

Ugrás (feltétel nélküli):
br label <címke>

Visszatérés függvényhívásból:
ret <típus> <érték> vagy ret void

Egyéb utasítások

Feltételes értékkiválasztás:
<eredmény> = select i1 <feltétel>, <típus1> <érték1>, <típus2> <érték2>

Értékkiválasztás vezérléstől függően:
<eredmény> = phi <típus> [ <érték1>, <címke1> ], …